package damas.ReglasDeAvances;

import java.util.LinkedList;
import java.util.List;

import utils.Pair;
import damas.modelo.DamasEstado;
import framework.IRule;
/**
 * @author sin codigo
 * Esta regla de avance, mueve una piza hacia arriba, tanto como para izq como derecha
 */
public class AvanzaSinComerHaciaArriba implements IRule<DamasEstado> {

	@Override
	public boolean isApplicable(DamasEstado estado) {
		return (estado.isMax()
				&& !estado.getDamasDeLista(
						estado.getRojasHabilitadasMovimiento()).isEmpty()
				&& estado.getRojasDamasObligadasAComer().isEmpty() && estado
				.getRojasObligadasAComer().isEmpty())
				|| (estado.isMin()
						&& !estado.getNegrasHabilitadasMovimiento().isEmpty()
						&& estado.getNegrasDamasObligadasAComer().isEmpty() && estado
						.getNegrasObligadasAComer().isEmpty());

	}

	// ya se que tengo alguna en la lista de obligadas a comer
	@Override
	public List<DamasEstado> apply(DamasEstado estado) {
		LinkedList<DamasEstado> newEstados = new LinkedList<DamasEstado>();
		int miColor = estado.isMax() ? estado.ROJA : estado.NEGRA;
		LinkedList<Pair<Integer, Integer>> sePuedenMover = new LinkedList<Pair<Integer, Integer>>();

		Pair<Integer, Integer> avArribaIzq;
		Pair<Integer, Integer> avArribaDer;
		int y;
		int x;
		// lista de damas rojas
		if (miColor == estado.ROJA) {
			sePuedenMover = (LinkedList<Pair<Integer, Integer>>) estado
					.getDamasDeLista(estado.getRojasHabilitadasMovimiento());
		} else {
			// lista de negras
			sePuedenMover = (LinkedList<Pair<Integer, Integer>>) estado
					.getNegrasHabilitadasMovimiento();
		}
		boolean useElClon = false;
		for (Pair<Integer, Integer> pair : sePuedenMover) {
			DamasEstado newEstado = estado.clone();
			y = pair.getFirstElem();
			x = pair.getSecondElem();
			avArribaDer = new Pair<Integer, Integer>(y - 1, x + 1);
			avArribaIzq = new Pair<Integer, Integer>(y - 1, x - 1);

			// la casilla esta en el tablero
			if (newEstado.esCasillaValida(avArribaDer)
					&& !newEstado.hayFichaEnLaCasilla(avArribaDer)
					&& newEstado.esMovimientoSimple(pair, avArribaDer)) {
				newEstado.mover(pair, avArribaDer);
				newEstados.add(newEstado);// meto el nuevo estado
				useElClon = true;
			}

			if (useElClon) {
				newEstado = estado.clone();
			}
			// la casilla esta en el tablero && tengo para comer
			if (newEstado.esCasillaValida(avArribaIzq)
					&& !newEstado.hayFichaEnLaCasilla(avArribaIzq)
					&& newEstado.esMovimientoSimple(pair, avArribaIzq)) {
				newEstado.mover(pair, avArribaIzq);
				newEstados.add(newEstado);// meto el nuevo estado
			}
		}// end for

		return newEstados;
	}
}
